﻿// Introduction.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "Introduction.h"  // 包含自定义头文件，获取声明

string rootdir = "D:/OpernCv/";  // 定义全局变量（指定图像根目录）

void showOutputImage(Mat& image, Mat& gray, Mat& anycolor)
{
    //1保存为单通道灰度图像
    vector<int> opts;
    opts.push_back(IMWRITE_PAM_FORMAT_GRAYSCALE);
    imwrite("D:/OpernCv/Introduction.jpg", gray, opts);
}

void showInputImage() {
    // 1. 读取图像（拼接“根目录 + 文件名”为完整路径）
    Mat image = imread(rootdir + "hachimitsu.jpg");//彩色图像
    Mat gray = imread(rootdir + "hachimitsu.jpg", IMREAD_GRAYSCALE);//回事图像
    Mat anycolor = imread(rootdir + "hachimitsu.jpg", IMREAD_UNCHANGED);//图像加载出来，不做任何改变，原图

    // 检查图像是否读取成功（避免文件不存在/路径错误导致崩溃）
    if (image.empty() || gray.empty() || anycolor.empty()) {
        cout << "错误：图像读取失败！请检查路径：" << rootdir + "hachimitsu.jpg" << endl;
        return;
    }
    // 2. 创建窗口 + 显示图像 + 等待按键 + 销毁窗口
    namedWindow("input", WINDOW_AUTOSIZE);
    imshow("input", image);
    waitKey(0);
    destroyAllWindows();
}

void showOutputImage()
{
    // 1. 读取原图（检查是否读取成功）
    Mat image = imread(rootdir + "hachimitsu.jpg");
    if (image.empty()) {
        cout << "错误：无法读取原图！路径：" << rootdir + "hachimitsu.jpg" << endl;
        return; // 读取失败则退出函数
    }

    // 2. 读取灰度图
    Mat gray = imread(rootdir + "hachimitsu.jpg", IMREAD_GRAYSCALE);
    if (gray.empty()) {
        cout << "错误：无法读取灰度图！" << endl;
        return;
    }

    //// 3. 保存灰度图到磁盘（使用正确的参数）
    //string savePath = rootdir + "Introduction.jpg"; // 拼接保存路径
    //bool saveSuccess = imwrite(savePath, gray);     // 保存灰度图（JPG格式无需额外参数）

    ////3.2保存为PNG 彩色压缩图像
    //Mat anycolor = imread(rootdir + "hachimitsu.jpg", IMREAD_ANYCOLOR);
    //vector<int>opts;
    //opts.push_back(IMWRITE_PNG_COMPRESSION);
    //opts.push_back(9);
    //imwrite(rootdir + "anycolor.png", anycolor, opts);
    
    //3.3 保存为jpg 高压缩比图像
    //Mat src = imread(rootdir + "hachimitsu.jpg", IMREAD_COLOR);
    //vector<int> opts;
    //opts.push_back(IMWRITE_JPEG_QUALITY);
    //opts.push_back(50);
    //opts.push_back(IMWRITE_JPEG_OPTIMIZE);
    //opts.push_back(1);
    //imwrite(rootdir + "src.jpg", src, opts);
    
    //3.4 保存为PNG格式， 且带透明通道
    vector<int> opts;
    opts.push_back(IMWRITE_PAM_FORMAT_RGB_ALPHA);

    //// 4. 检查保存结果
    //if (saveSuccess) {
    //    cout << "图像保存成功！路径：" << savePath << endl;
    //}
    //else {
    //    cout << "图像保存失败！可能原因：路径不存在或权限不足。" << endl;
    //}
}

void showInputIVideo()
{
    //VideoCapture capture;
    // //1, 读取avi等文件
    ////capture.open(rootdir + "der-soConvert.avi", CAP_FFMPEG);
    ////2,读取摄像头
    //capture.open(0, CAP_ANY);
    ////3,从视频URL地址中读取
    ////capture.open("https://www.douyin.com/?recommend=1", CAP_ANY);
    //Mat frame;
    //while (true) 
    //{
    //    //读帧
    //    bool ret = capture.read(frame);
    //    if (!ret) break;
    //    Mat resizedFrame;

    //    double scale = 0.5;  // 缩放比例（0.5表示缩小到原来的一半，可调整）
    //    // 计算缩放后的尺寸（保持宽高比）
    //    cv::Size newSize(frame.cols * scale, frame.rows * scale);
    //    // 使用INTER_AREA插值（缩小时画质更清晰）
    //    resize(frame, resizedFrame, newSize, 0, 0, INTER_AREA);

    //    imshow("视频播放", resizedFrame);
    //    //添加帧处理
    //    char c = waitKey(30);  // 30ms延迟（适合25-30fps视频）
    //    if (c == 27) break;    // ESC键退出
    //    if (c == ' ') waitKey(0);  // 空格键暂停（按任意键继续）
    //}
    //waitKey(0);
    //
    VideoCapture capture;
    capture.open(rootdir + "der-soConvert.avi", CAP_FFMPEG);
    int height = capture.get(CAP_PROP_FRAME_HEIGHT);
    int width = capture.get(CAP_PROP_FRAME_WIDTH);
    double fps = capture.get(CAP_PROP_FPS);
    double count = capture.get(CAP_PROP_FRAME_COUNT);
    printf("height: %d, width: %d, fps: %2.f, count: %.2f \n", height, width, fps, count);
    destroyAllWindows();
}

void Readvideo_demo()
{
    VideoCapture capture;
    capture.open(rootdir + "der-soConvert.avi", CAP_FFMPEG);
    int height = capture.get(CAP_PROP_FRAME_HEIGHT);
    int width = capture.get(CAP_PROP_FRAME_WIDTH);
    double fps = capture.get(CAP_PROP_FPS);
    double count = capture.get(CAP_PROP_FRAME_COUNT);
    printf("height: %d, width: %d, fps: %2.f, count: %.2f \n", height, width, fps, count);

    VideoWriter writer("D:/OpernCv/out.avi", capture.get(CAP_PROP_FOURCC), fps, Size(width, count));
    Mat frame;
    while (true)
    {
        //读帧
        bool ret = capture.read(frame);
        if (!ret) break;
        imshow("frame", frame);
        //添加帧处理
        writer.write(frame);
        char c = waitKey(100);
        if (27 == c)
        {
            break;
        }
    }
    capture.release();
    writer.release();
    waitKey(0);
    destroyAllWindows();
    return;
}